package com.hsurosy.hsuchain.nft.user.domain.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hsurosy.hsuchain.nft.api.user.constant.UserOperateTypeEnum;
import com.hsurosy.hsuchain.nft.user.domain.entity.User;
import com.hsurosy.hsuchain.nft.user.domain.entity.UserOperateStream;
import com.hsurosy.hsuchain.nft.user.infrastructure.mapper.UserOperateStreamMapper;
import com.alibaba.fastjson2.JSON;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * 用户操作流水服务类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 19:03
 * @Description
 * @Version: v1.0.0
 */
@Service
public class UserOperateStreamService extends ServiceImpl<UserOperateStreamMapper, UserOperateStream> {

    /**
     * 插入用户操作流水
     * <p>
     * 该方法接收一个 User 对象和操作类型，将操作详情序列化为 JSON 字符串，并将该操作记录保存到数据库。
     * </p>
     *
     * @param user 用户对象，包含操作用户的相关信息
     * @param type 操作类型，使用 {@link UserOperateTypeEnum} 枚举表示
     * @return Long 返回生成的操作流水记录的 ID，如果插入失败则返回 null
     */
    public Long insertStream(User user, UserOperateTypeEnum type) {
        // 创建操作流水对象
        UserOperateStream stream = new UserOperateStream();
        stream.setUserId(String.valueOf(user.getId())); // 设置用户ID
        stream.setOperateTime(new Date()); // 设置操作时间
        stream.setType(type.name()); // 设置操作类型
        stream.setParam(JSON.toJSONString(user)); // 将用户对象序列化为 JSON 并设置为参数

        // 保存操作流水记录
        boolean result = save(stream);

        // 如果保存成功，返回操作流水ID
        if (result) {
            return stream.getId();
        }

        // 如果保存失败，返回 null
        return null;
    }
}
